import re

import cv2
import os
import numpy as np

# 获取当前脚本所在的文件夹路径
current_file_path = os.path.abspath(__file__)
current_dir_path = os.path.dirname(current_file_path)
# 再退一层
mub_tp = os.path.dirname(current_dir_path)
# 构建目标目录路径（即同级目录下的'static'文件夹）
static_dir_path = os.path.join(mub_tp, 'static')



# 使用模板匹配进行图像对比
# 使用模板匹配进行图像对比
def compare_images(image1_path, image2_path, roi=None):
    """
    :param image1_path: 大图路径
    :param image2_path: 小图（模板）路径
    :param roi: 感兴趣区域 (x, y, w, h)，默认为None表示整个图像
    :return: 最大匹配值和位置
    """
    # 读取大图和小图
    img = cv2.imread(image1_path, cv2.IMREAD_COLOR)
    template = cv2.imread(image2_path, cv2.IMREAD_COLOR)

    if img is None or template is None:
        print("无法加载图像，请检查路径是否正确")
        return -1, None

    # 将图片转换为灰度图
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray_template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

    # 如果提供了ROI，则裁剪大图
    if roi is not None:
        x, y, w, h = roi
        roi_gray_img = gray_img[y:y+h, x:x+w]
    else:
        roi_gray_img = gray_img

    # 使用模板匹配方法
    result = cv2.matchTemplate(roi_gray_img, gray_template, cv2.TM_CCOEFF_NORMED)

    # 获取匹配结果中的最大值及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

    # 如果使用了ROI，需要调整max_loc的位置到原始图像坐标系中
    if roi is not None:
        max_loc = (max_loc[0] + x, max_loc[1] + y)
    # print(max_val)
    return max_val, max_loc




def compare_images_color(image1_path, image2_path, roi=None):
    """
    :param image1_path: 大图路径
    :param image2_path: 小图（模板）路径
    :param roi: 感兴趣区域 (x, y, w, h)，默认为None表示整个图像
    :return: 最大匹配值
    """
    # 读取大图和小图
    img = cv2.imread(image1_path, cv2.IMREAD_COLOR)
    template = cv2.imread(image2_path,cv2.IMREAD_COLOR)

    if img is None or template is None:
        print("无法加载图像，请检查路径是否正确")
        return -1

    # 如果提供了ROI，则裁剪大图
    if roi is not None:
        x, y, w, h = map(int, roi)  # 确保所有值都是整数
        img = img[y:y+h, x:x+w]

    # 使用模板匹配方法
    result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

    # 获取匹配结果中的最大值及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    # print(max_val)
    return max_val  # 返回最大匹配值作为相似度得分



def assert_camera(roi, target_dir_path, ):
    '''
    对摄像头区域进行断言比对
    '''

    # print(1111111111111111111111111111)
    # print(f'存放了全部比对图的路径是：{target_dir_path}')
    # print(1111111111111111111111111111)
    全部比对图的路径 = target_dir_path



    # 获取最尾部级的名字
    end_name = os.path.basename(target_dir_path)
    # print(end_name.split('.')[0])
    need_path = os.path.dirname(os.path.dirname(target_dir_path))
    # print(need_path)

    # 先构建出摄像头比对通过的父级目录
    camera_path = os.path.join(need_path, 'static', end_name)
    print(camera_path)
    if not os.path.exists(camera_path):
        # print(11111)
        os.makedirs(camera_path)

    # 获取目标预期图片（1.先获取当前目录路径
    # 2.寻找到摄像头的预期图片路径）
    存放摄像头预期图片的路径 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static', 'camera', end_name.split('.')[0] + '.png')
    # print(存放摄像头预期图片的路径)


    # 获取存放比对阀值通过的图片路径
    摄像头比对通过的图片路径 = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'will_assert', end_name.split('.')[0])

    # 对排序后的文件列表进行遍历
    # 获取所有.jpg文件并自然排序
    jpg_files = [f for f in os.listdir(camera_path) if f.lower().endswith('.jpg')]

    def natural_sort_key(s):
        return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\d+)', s)]

    jpg_files.sort(key=natural_sort_key)

    for frame_filename in jpg_files:

        # 先构建全部图片目录下的预期图片名字
        frame_path = os.path.join(target_dir_path, frame_filename)

        # print(frame_path)
        # opencv图像比对函数
        similarity_score, _ = compare_images(frame_path, 存放摄像头预期图片的路径, roi)
        if not(isinstance(similarity_score, (int, float)) and similarity_score > 0.7):  #把符合预期的反值存起
            # 复制图片到新文件夹
            new_frame_path = os.path.join(摄像头比对通过的图片路径, frame_filename)
            cv2.imwrite(new_frame_path, cv2.imread(frame_path))
            # print(f"保存相似图片: {frame_filename}")

    return 全部比对图的路径
    return 摄像头比对通过的图片路径
    print("对比完成，已将相似度大于0.7的图片存放到新文件夹中。")




# 下面是对绿色文字的断言
def assert_green(roi, target_dir_path):
    '''
    对绿色文字部分进行断言对比
    :param roi:
    :return:
    '''

    # print(f'存放了全部比对图的路径是：{target_dir_path}')
    全部比对图的路径 = target_dir_path

    # 获取最尾部级的名字
    end_name = os.path.basename(target_dir_path)
    # print(end_name.split('.')[0])
    need_path = os.path.dirname(os.path.dirname(target_dir_path))
    # print(need_path)

    # 先构建出绿色文字比对通过的父级目录
    camera_path = os.path.join(need_path, 'static', end_name)
    # print(camera_path)
    if not os.path.exists(camera_path):
        # print(11111)
        os.makedirs(camera_path)

    # 获取目标预期图片（1.先获取当前目录路径
    # 2.寻找到绿色文字的预期图片路径）
    存放绿色文字预期图片的路径 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static', 'green',
                                            end_name.split('.')[0] + '.png')

    # 获取存放比对阀值通过的图片路径
    绿色文字比对通过的图片路径 = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'green_word',
                                            end_name.split('.')[0])

    # 对排序后的文件列表进行遍历
    # 获取所有.jpg文件并自然排序
    jpg_files = [f for f in os.listdir(camera_path) if f.lower().endswith('.jpg')]

    def natural_sort_key(s):
        return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\d+)', s)]

    jpg_files.sort(key=natural_sort_key)

    for frame_filename in jpg_files:
        frame_path = os.path.join(target_dir_path, frame_filename)

        # print(frame_path)
        # opencv彩色图像比对函数
        similarity_score, _ = compare_images(frame_path, 存放绿色文字预期图片的路径, roi)

        if isinstance(similarity_score, (int, float)) and similarity_score > 0.18:
            # 复制图片到新文件夹
            new_frame_path = os.path.join(绿色文字比对通过的图片路径, frame_filename)
            cv2.imwrite(new_frame_path, cv2.imread(frame_path))
            # print(f"保存相似图片: {frame_filename}")

    return 全部比对图的路径
    return 绿色文字比对通过的图片路径
    print("对比完成，已将绿色文字相似度大于0.3的图片存放到新文件夹中。")


#
# if __name__ == '__main__':
    # assert_camera(roi= (0, 786, 960, 294), target_dir_path='/Users/zltest/testing_video_process/static/wired_720')
    # assert_green(roi= (200, 200, 760, 340),   target_dir_path='/Users/zltest/testing_video_process/static/wired_720')


    # (400, 216, 560, 432)